package cn.icexmoon.proxy;

import org.objectweb.asm.*;

public class $Proxy0Dump {

    public static byte[] dump() throws Exception {

        ClassWriter classWriter = new ClassWriter(0);
        FieldVisitor fieldVisitor;
        RecordComponentVisitor recordComponentVisitor;
        MethodVisitor methodVisitor;
        AnnotationVisitor annotationVisitor0;

        classWriter.visit(Opcodes.V21, Opcodes.ACC_SUPER, "cn/icexmoon/proxy/$Proxy0", null, "java/lang/reflect/Proxy", new String[]{"cn/icexmoon/proxy/HowToWorkTests6$DoSomething"});

        classWriter.visitSource("$Proxy0.java", null);

        classWriter.visitInnerClass("cn/icexmoon/proxy/HowToWorkTests6$DoSomething", "cn/icexmoon/proxy/HowToWorkTests6", "DoSomething", Opcodes.ACC_STATIC | Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE);

        {
            methodVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "(Ljava/lang/reflect/InvocationHandler;)V", null, null);
            methodVisitor.visitParameter("invokeHandler", 0);
            methodVisitor.visitCode();
            Label label0 = new Label();
            methodVisitor.visitLabel(label0);
            methodVisitor.visitLineNumber(17, label0);
            methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
            methodVisitor.visitVarInsn(Opcodes.ALOAD, 1);
            methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/reflect/Proxy", "<init>", "(Ljava/lang/reflect/InvocationHandler;)V", false);
            Label label1 = new Label();
            methodVisitor.visitLabel(label1);
            methodVisitor.visitLineNumber(18, label1);
            methodVisitor.visitInsn(Opcodes.RETURN);
            Label label2 = new Label();
            methodVisitor.visitLabel(label2);
            methodVisitor.visitLocalVariable("this", "Lcn/icexmoon/proxy/$Proxy0;", null, label0, label2, 0);
            methodVisitor.visitLocalVariable("invokeHandler", "Ljava/lang/reflect/InvocationHandler;", null, label0, label2, 1);
            methodVisitor.visitMaxs(2, 2);
            methodVisitor.visitEnd();
        }
        {
            methodVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "doSomething", "()V", null, null);
            methodVisitor.visitCode();
            Label label0 = new Label();
            Label label1 = new Label();
            Label label2 = new Label();
            methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/RuntimeException");
            methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Error");
            Label label3 = new Label();
            methodVisitor.visitTryCatchBlock(label0, label1, label3, "java/lang/Throwable");
            methodVisitor.visitLabel(label0);
            methodVisitor.visitLineNumber(23, label0);
            methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
            methodVisitor.visitFieldInsn(Opcodes.GETFIELD, "cn/icexmoon/proxy/$Proxy0", "h", "Ljava/lang/reflect/InvocationHandler;");
            methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
            methodVisitor.visitLdcInsn(Type.getType("Lcn/icexmoon/proxy/HowToWorkTests6$DoSomething;"));
            methodVisitor.visitLdcInsn("doSomething");
            methodVisitor.visitInsn(Opcodes.ICONST_0);
            methodVisitor.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Class");
            methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", false);
            methodVisitor.visitInsn(Opcodes.ACONST_NULL);
            methodVisitor.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/lang/reflect/InvocationHandler", "invoke", "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;", true);
            methodVisitor.visitInsn(Opcodes.POP);
            methodVisitor.visitLabel(label1);
            methodVisitor.visitLineNumber(28, label1);
            Label label4 = new Label();
            methodVisitor.visitJumpInsn(Opcodes.GOTO, label4);
            methodVisitor.visitLabel(label2);
            methodVisitor.visitLineNumber(24, label2);
            methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{"java/lang/Throwable"});
            methodVisitor.visitVarInsn(Opcodes.ASTORE, 1);
            Label label5 = new Label();
            methodVisitor.visitLabel(label5);
            methodVisitor.visitLineNumber(25, label5);
            methodVisitor.visitVarInsn(Opcodes.ALOAD, 1);
            methodVisitor.visitInsn(Opcodes.ATHROW);
            methodVisitor.visitLabel(label3);
            methodVisitor.visitLineNumber(26, label3);
            methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{"java/lang/Throwable"});
            methodVisitor.visitVarInsn(Opcodes.ASTORE, 1);
            Label label6 = new Label();
            methodVisitor.visitLabel(label6);
            methodVisitor.visitLineNumber(27, label6);
            methodVisitor.visitTypeInsn(Opcodes.NEW, "java/lang/reflect/UndeclaredThrowableException");
            methodVisitor.visitInsn(Opcodes.DUP);
            methodVisitor.visitVarInsn(Opcodes.ALOAD, 1);
            methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>", "(Ljava/lang/Throwable;)V", false);
            methodVisitor.visitInsn(Opcodes.ATHROW);
            methodVisitor.visitLabel(label4);
            methodVisitor.visitLineNumber(29, label4);
            methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
            methodVisitor.visitInsn(Opcodes.RETURN);
            Label label7 = new Label();
            methodVisitor.visitLabel(label7);
            methodVisitor.visitLocalVariable("e", "Ljava/lang/Throwable;", null, label5, label3, 1);
            methodVisitor.visitLocalVariable("e", "Ljava/lang/Throwable;", null, label6, label4, 1);
            methodVisitor.visitLocalVariable("this", "Lcn/icexmoon/proxy/$Proxy0;", null, label0, label7, 0);
            methodVisitor.visitMaxs(5, 2);
            methodVisitor.visitEnd();
        }
        {
            methodVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "doSomethingElse", "()V", null, null);
            methodVisitor.visitCode();
            Label label0 = new Label();
            Label label1 = new Label();
            Label label2 = new Label();
            methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/RuntimeException");
            methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Error");
            Label label3 = new Label();
            methodVisitor.visitTryCatchBlock(label0, label1, label3, "java/lang/Throwable");
            methodVisitor.visitLabel(label0);
            methodVisitor.visitLineNumber(34, label0);
            methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
            methodVisitor.visitFieldInsn(Opcodes.GETFIELD, "cn/icexmoon/proxy/$Proxy0", "h", "Ljava/lang/reflect/InvocationHandler;");
            methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
            methodVisitor.visitLdcInsn(Type.getType("Lcn/icexmoon/proxy/HowToWorkTests6$DoSomething;"));
            methodVisitor.visitLdcInsn("doSomethingElse");
            methodVisitor.visitInsn(Opcodes.ICONST_0);
            methodVisitor.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Class");
            methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", false);
            methodVisitor.visitInsn(Opcodes.ACONST_NULL);
            methodVisitor.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/lang/reflect/InvocationHandler", "invoke", "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;", true);
            methodVisitor.visitInsn(Opcodes.POP);
            methodVisitor.visitLabel(label1);
            methodVisitor.visitLineNumber(39, label1);
            Label label4 = new Label();
            methodVisitor.visitJumpInsn(Opcodes.GOTO, label4);
            methodVisitor.visitLabel(label2);
            methodVisitor.visitLineNumber(35, label2);
            methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{"java/lang/Throwable"});
            methodVisitor.visitVarInsn(Opcodes.ASTORE, 1);
            Label label5 = new Label();
            methodVisitor.visitLabel(label5);
            methodVisitor.visitLineNumber(36, label5);
            methodVisitor.visitVarInsn(Opcodes.ALOAD, 1);
            methodVisitor.visitInsn(Opcodes.ATHROW);
            methodVisitor.visitLabel(label3);
            methodVisitor.visitLineNumber(37, label3);
            methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{"java/lang/Throwable"});
            methodVisitor.visitVarInsn(Opcodes.ASTORE, 1);
            Label label6 = new Label();
            methodVisitor.visitLabel(label6);
            methodVisitor.visitLineNumber(38, label6);
            methodVisitor.visitTypeInsn(Opcodes.NEW, "java/lang/reflect/UndeclaredThrowableException");
            methodVisitor.visitInsn(Opcodes.DUP);
            methodVisitor.visitVarInsn(Opcodes.ALOAD, 1);
            methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>", "(Ljava/lang/Throwable;)V", false);
            methodVisitor.visitInsn(Opcodes.ATHROW);
            methodVisitor.visitLabel(label4);
            methodVisitor.visitLineNumber(40, label4);
            methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
            methodVisitor.visitInsn(Opcodes.RETURN);
            Label label7 = new Label();
            methodVisitor.visitLabel(label7);
            methodVisitor.visitLocalVariable("e", "Ljava/lang/Throwable;", null, label5, label3, 1);
            methodVisitor.visitLocalVariable("e", "Ljava/lang/Throwable;", null, label6, label4, 1);
            methodVisitor.visitLocalVariable("this", "Lcn/icexmoon/proxy/$Proxy0;", null, label0, label7, 0);
            methodVisitor.visitMaxs(5, 2);
            methodVisitor.visitEnd();
        }
        {
            methodVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "plus", "(II)I", null, null);
            methodVisitor.visitParameter("a", 0);
            methodVisitor.visitParameter("b", 0);
            methodVisitor.visitCode();
            Label label0 = new Label();
            Label label1 = new Label();
            Label label2 = new Label();
            methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/RuntimeException");
            methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Error");
            Label label3 = new Label();
            methodVisitor.visitTryCatchBlock(label0, label1, label3, "java/lang/Throwable");
            methodVisitor.visitLabel(label0);
            methodVisitor.visitLineNumber(46, label0);
            methodVisitor.visitInsn(Opcodes.ICONST_2);
            methodVisitor.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object");
            methodVisitor.visitInsn(Opcodes.DUP);
            methodVisitor.visitInsn(Opcodes.ICONST_0);
            methodVisitor.visitVarInsn(Opcodes.ILOAD, 1);
            methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false);
            methodVisitor.visitInsn(Opcodes.AASTORE);
            methodVisitor.visitInsn(Opcodes.DUP);
            methodVisitor.visitInsn(Opcodes.ICONST_1);
            methodVisitor.visitVarInsn(Opcodes.ILOAD, 2);
            methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false);
            methodVisitor.visitInsn(Opcodes.AASTORE);
            methodVisitor.visitVarInsn(Opcodes.ASTORE, 4);
            Label label4 = new Label();
            methodVisitor.visitLabel(label4);
            methodVisitor.visitLineNumber(47, label4);
            methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
            methodVisitor.visitFieldInsn(Opcodes.GETFIELD, "cn/icexmoon/proxy/$Proxy0", "h", "Ljava/lang/reflect/InvocationHandler;");
            methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
            methodVisitor.visitLdcInsn(Type.getType("Lcn/icexmoon/proxy/HowToWorkTests6$DoSomething;"));
            methodVisitor.visitLdcInsn("plus");
            methodVisitor.visitInsn(Opcodes.ICONST_2);
            methodVisitor.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Class");
            methodVisitor.visitInsn(Opcodes.DUP);
            methodVisitor.visitInsn(Opcodes.ICONST_0);
            methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/Integer", "TYPE", "Ljava/lang/Class;");
            methodVisitor.visitInsn(Opcodes.AASTORE);
            methodVisitor.visitInsn(Opcodes.DUP);
            methodVisitor.visitInsn(Opcodes.ICONST_1);
            methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/Integer", "TYPE", "Ljava/lang/Class;");
            methodVisitor.visitInsn(Opcodes.AASTORE);
            methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", false);
            methodVisitor.visitVarInsn(Opcodes.ALOAD, 4);
            methodVisitor.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/lang/reflect/InvocationHandler", "invoke", "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;", true);
            methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Integer");
            methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I", false);
            methodVisitor.visitVarInsn(Opcodes.ISTORE, 3);
            methodVisitor.visitLabel(label1);
            methodVisitor.visitLineNumber(52, label1);
            Label label5 = new Label();
            methodVisitor.visitJumpInsn(Opcodes.GOTO, label5);
            methodVisitor.visitLabel(label2);
            methodVisitor.visitLineNumber(48, label2);
            methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{"java/lang/Throwable"});
            methodVisitor.visitVarInsn(Opcodes.ASTORE, 4);
            Label label6 = new Label();
            methodVisitor.visitLabel(label6);
            methodVisitor.visitLineNumber(49, label6);
            methodVisitor.visitVarInsn(Opcodes.ALOAD, 4);
            methodVisitor.visitInsn(Opcodes.ATHROW);
            methodVisitor.visitLabel(label3);
            methodVisitor.visitLineNumber(50, label3);
            methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{"java/lang/Throwable"});
            methodVisitor.visitVarInsn(Opcodes.ASTORE, 4);
            Label label7 = new Label();
            methodVisitor.visitLabel(label7);
            methodVisitor.visitLineNumber(51, label7);
            methodVisitor.visitTypeInsn(Opcodes.NEW, "java/lang/reflect/UndeclaredThrowableException");
            methodVisitor.visitInsn(Opcodes.DUP);
            methodVisitor.visitVarInsn(Opcodes.ALOAD, 4);
            methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>", "(Ljava/lang/Throwable;)V", false);
            methodVisitor.visitInsn(Opcodes.ATHROW);
            methodVisitor.visitLabel(label5);
            methodVisitor.visitLineNumber(53, label5);
            methodVisitor.visitFrame(Opcodes.F_APPEND, 1, new Object[]{Opcodes.INTEGER}, 0, null);
            methodVisitor.visitVarInsn(Opcodes.ILOAD, 3);
            methodVisitor.visitInsn(Opcodes.IRETURN);
            Label label8 = new Label();
            methodVisitor.visitLabel(label8);
            methodVisitor.visitLocalVariable("args", "[Ljava/lang/Object;", null, label4, label1, 4);
            methodVisitor.visitLocalVariable("result", "I", null, label1, label2, 3);
            methodVisitor.visitLocalVariable("e", "Ljava/lang/Throwable;", null, label6, label3, 4);
            methodVisitor.visitLocalVariable("e", "Ljava/lang/Throwable;", null, label7, label5, 4);
            methodVisitor.visitLocalVariable("this", "Lcn/icexmoon/proxy/$Proxy0;", null, label0, label8, 0);
            methodVisitor.visitLocalVariable("a", "I", null, label0, label8, 1);
            methodVisitor.visitLocalVariable("b", "I", null, label0, label8, 2);
            methodVisitor.visitLocalVariable("result", "I", null, label5, label8, 3);
            methodVisitor.visitMaxs(8, 5);
            methodVisitor.visitEnd();
        }
        classWriter.visitEnd();

        return classWriter.toByteArray();
    }
}
